package com.whfc.fvs.dao;

import com.whfc.fvs.dto.FvsAnalysisDTO;
import com.whfc.fvs.dto.FvsDeviceDTO;
import com.whfc.fvs.entity.FvsDevice;
import com.whfc.fvs.param.FvsDeviceListParam;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * @author : qzexing
 * @version : 1.0
 * @date : 2020-09-22 17:02
 */
public interface FvsDeviceMapper {
    int deleteByPrimaryKey(Integer id);

    int insert(FvsDevice record);

    int insertSelective(FvsDevice record);

    FvsDevice selectByPrimaryKey(Integer id);

    int updateByPrimaryKeySelective(FvsDevice record);

    int updateByPrimaryKey(FvsDevice record);

    /**
     * 获取视频设备列表
     *
     * @param deptId       deptId
     * @param groupId      groupId
     * @param keyword      keyword
     * @param deviceType   deviceType
     * @param deviceStatus deviceStatus
     * @param platform     platform
     * @param webcamType   webcamType
     * @return
     */
    List<FvsDeviceDTO> selectDeviceList(@Param("deptId") Integer deptId,
                                        @Param("groupId") Integer groupId,
                                        @Param("keyword") String keyword,
                                        @Param("deviceType") Integer deviceType,
                                        @Param("deviceStatus") Integer deviceStatus,
                                        @Param("platform") String platform,
                                        @Param("webcamType") Integer webcamType);

    /**
     * 获取监控设备详情
     *
     * @param id
     * @return
     */
    FvsDeviceDTO selectFvsDeviceDetail(@Param("id") Integer id);

    /**
     * 逻辑删除设备
     *
     * @param id
     */
    void deleteLogicById(@Param("id") Integer id);

    /**
     * 通过设备id删除设备
     *
     * @param aliDeviceId aliDeviceId
     */
    void deleteLogicByAliDeviceId(@Param("aliDeviceId") String aliDeviceId);

    /**
     * 更新视频截图
     *
     * @param gbId
     * @param snapshotUrl
     */
    void updateSnapshotUrlByGbId(@Param("gbId") String gbId, @Param("snapshotUrl") String snapshotUrl);


    /**
     * 通过aliDeviceId查找
     *
     * @param
     * @return
     */
    FvsDevice selectByGbId(@Param("gbId") String gbId);

    /**
     * 通过aliStreamId查找
     *
     * @param streamId
     * @return FvsDevice
     */
    FvsDevice selectByAliStreamId(@Param("streamId") String streamId);

    /**
     * 通过aliStreamId查找
     *
     * @param aliDeviceId
     * @return FvsDevice
     */
    FvsDevice selectByAliDeviceId(@Param("aliDeviceId") String aliDeviceId);


    /**
     * 更新视频流状态
     *
     * @param aliDeviceId  aliDeviceId
     * @param deviceStatus deviceStatus
     * @param streamStatus streamStatus
     */
    void updateByAliDeviceId(@Param("aliDeviceId") String aliDeviceId,
                             @Param("deviceStatus") Integer deviceStatus,
                             @Param("streamStatus") Integer streamStatus);

    /**
     * 更新视频流状态
     *
     * @param aliStreamId  aliStreamId
     * @param deviceStatus deviceStatus
     * @param streamStatus streamStatus
     * @param snapshotUrl  snapshotUrl
     */
    void updateByAliStreamId(@Param("aliStreamId") String aliStreamId,
                             @Param("deviceStatus") Integer deviceStatus,
                             @Param("streamStatus") Integer streamStatus,
                             @Param("snapshotUrl") String snapshotUrl);


    /**
     * 根据组织机构和关键字查找
     *
     * @param platform platform
     * @return 设备列表
     */
    List<FvsDeviceDTO> selectByPlatform(@Param("platform") Integer platform);

    /**
     * 根据pid删除设备
     *
     * @param pid pid
     */
    void logicDeleteByPid(@Param("pid") Integer pid);

    /**
     * 批量更新自定义设备的设备状态为在线
     *
     * @param deviceIdList deviceIdList
     * @param deviceStatus deviceStatus
     */
    void batchUpdateDeviceStatus(@Param("deviceIdList") List<Integer> deviceIdList, @Param("deviceStatus") Integer deviceStatus);


    /**
     * 根据pid 查找设备
     *
     * @param pid pid
     * @return List<FvsDeviceDTO>
     */
    List<FvsDeviceDTO> selectDeviceByPid(@Param("pid") Integer pid);

    /**
     * 获取视频监控列表
     *
     * @param fvsDeviceListParam 查询视频监控参数
     * @return List<FvsDeviceDTO>
     */
    List<FvsDeviceDTO> selectFvsList(FvsDeviceListParam fvsDeviceListParam);

    /**
     * 根据状态查找视频监控数量
     *
     * @param deptIds
     * @param deviceStatus
     * @return
     */
    Integer countFvsDeviceNum(@Param("deptIds") List<Integer> deptIds, @Param("deviceStatus") Integer deviceStatus);

    /**
     * 获取简单信息监控列表
     *
     * @param deptId 组织机构ID
     * @return 简单信息监控列表
     */
    List<FvsDeviceDTO> selectSimpleInfoFvsList(@Param("deptId") Integer deptId);

    /**
     * 根据分组id查询设备数量
     *
     * @param groupId
     * @return
     */
    Integer countByGroupId(@Param("groupId") Integer groupId);

    /**
     * 根据设备ID查找设备监控列表
     *
     * @param deviceIdList 设备ID列表
     * @return 设备监控列表
     */
    List<FvsDeviceDTO> selectByDeviceIdList(@Param("deviceIdList") List<Integer> deviceIdList);

    /**
     * 根据组织机构ID和平台获取设备
     *
     * @param deptId    组织机构ID
     * @param platforms 平台
     * @return 设备
     */
    List<FvsDeviceDTO> selectByDeptIdAndPlatform(@Param("deptId") Integer deptId, @Param("platforms") List<Integer> platforms);

    /**
     * 查询摄像头数量
     *
     * @param deptId
     * @param date
     * @return
     */
    Integer selectFvsDeviceNum(@Param("deptId") Integer deptId, @Param("date") Date date);

    /**
     * 根据组织机构ID列表获取设备列表
     *
     * @param deptIdList 组织机构ID
     * @return 设备列表
     */
    List<FvsDeviceDTO> selectDeviceListByDeptIdList(@Param("deptIdList") List<Integer> deptIdList);

    /**
     * 查询全部设备
     *
     * @return
     */
    List<FvsDevice> selectAll();

    /**
     * 更新监控位置信息
     *
     * @param deviceId 硬件设备ID
     * @param lng      经度
     * @param lat      纬度
     */
    void updateDeviceGpsByMachDeviceId(@Param("deviceId") Integer deviceId, @Param("lng") Double lng, @Param("lat") Double lat);

    /**
     * 获取视频统计
     *
     * @param deptId
     * @return
     */
    FvsAnalysisDTO analysis(Integer deptId);

    /**
     * 更新硬盘录像机班组ID
     *
     * @param pid     父节点ID
     * @param groupId 班组ID
     */
    void updateDeviceGroupIdByPid(@Param("pid") Integer pid, @Param("groupId") Integer groupId);

    /**
     * 根据sn获取设备
     * @param sn
     * @return
     */
    FvsDeviceDTO selectBySn(@Param("sn")String sn);
}